home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / qex / qexbert / bert.c next >
C/C++ Source or Header  |  1996-06-25  |  5KB  |  251 lines

  1. /*    BERT.C -- BER test program. Operates in conjunction with
  2.  *    TI DSK board via serial port.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <bios.h>
  8. #include <conio.h>
  9. #include <ctype.h>
  10. #include <dos.h>
  11. #include <math.h>
  12. #include <time.h>
  13.  
  14. #include "comport.h"
  15.  
  16. static COMM *comm;
  17. static char verbose = 0;
  18.  
  19. void
  20. gone()
  21. {
  22.     close_com(comm);
  23. }
  24.  
  25. /*    r e c v _ d s p
  26.  *
  27.  *    Receive a character from the DSP. Return -1 after "timeout" msec
  28.  * of waiting for a char.
  29.  */
  30. int
  31. recv_dsp(unsigned timeout)
  32. {
  33.     int c;
  34.     long tval = timeout;
  35.  
  36.     while ((c = com_in(comm)) == -1) {
  37.         if (tval <= 0) {
  38.             if (verbose)
  39.                 printf("\nTimeout\n");
  40.             return -1;
  41.         }
  42.         if (bioskey(1) != 0)
  43.             if ((bioskey(0) & 0xff) == 0x1b)
  44.                 return -1;
  45.         delay(10);
  46.         tval -= 10;
  47.     }
  48.     if (verbose) {
  49.         putch(c);
  50.         printf("(%02X)", c);
  51.     }
  52.     return c;
  53. }
  54.  
  55. /*    c m d _ d s p
  56.  *
  57.  *    Interrupts the DSP and sends a new command. Procedure:
  58.  *        Send the command
  59.  *        Get a "Ready" response from the DSP
  60.  *        Send the command again
  61.  */
  62. int
  63. cmd_dsp(int cmd)
  64. {
  65.     send_com(comm, cmd, 0);
  66.     if (recv_dsp(1000) != 'R')
  67.         return -1;
  68.     send_com(comm, cmd, 0);
  69.     return 0;
  70. }
  71.  
  72. /*    c m d _ r e s p
  73.  *
  74.  *    Send a command to the DSP and wait "timeout" msec for
  75.  *    a one-byte response.
  76.  */
  77. int
  78. cmd_resp(int cmd, unsigned timeout)
  79. {
  80.     if ((cmd_dsp(cmd)) == -1)
  81.         return -1;
  82.     return recv_dsp(timeout);
  83. }
  84.  
  85. /*    c m d _ r e s p 1 6
  86.  *
  87.  *    Send a command to the DSP and wait "timeout" msec for
  88.  *    a two-byte response.
  89.  */
  90. long
  91. cmd_resp16(int cmd, unsigned timeout)
  92. {
  93.     long l, h;
  94.  
  95.     if ((l = cmd_resp(cmd, timeout)) == -1)
  96.         return -1;
  97.     if ((h = recv_dsp(100)) == -1)
  98.         return -1;
  99.     return (h << 8) | l;
  100. }
  101.  
  102. long
  103. cmd_resp32(int cmd, unsigned timeout)
  104. {
  105.     long l, h;
  106.  
  107.     if ((l = cmd_resp16(cmd, timeout)) == -1)
  108.         return -1;
  109.     if ((h = recv_dsp(100)) == -1)
  110.         return -1;
  111.     l = ((l & 0x7fff) << 16) | h;
  112.     if ((h = recv_dsp(100)) == -1)
  113.         return -1;
  114.     l = l | (h << 8);
  115.     return l;
  116. }
  117.  
  118. long
  119. cmd_resp64(int cmd, unsigned timeout, long *sec)
  120. {
  121.     long l, h;
  122.  
  123.     if ((l = cmd_resp32(cmd, timeout)) == -1)
  124.         return -1;
  125.     if (sec != NULL)
  126.         *sec = l;
  127.     if ((l = recv_dsp(100)) == -1)
  128.         return -1;
  129.     if ((h = recv_dsp(100)) == -1)
  130.         return -1;
  131.     l = (h << 8) | l;
  132.     if ((h = recv_dsp(100)) == -1)
  133.         return -1;
  134.     l = ((l & 0x7fff) << 16) | h;
  135.     if ((h = recv_dsp(100)) == -1)
  136.         return -1;
  137.     l = l | (h << 8);
  138.     return l;
  139. }
  140.  
  141. long
  142. ber6(void)
  143. {
  144.     int i;
  145.     long l, s, n;
  146.  
  147.     s = 0;
  148.     printf("Running BER Test...");
  149.     for (i = 0; i < 10; i++) {
  150.         l = cmd_resp32('5', 15000);
  151.         if (l == -1) {
  152.             printf("\nTimeout\n");
  153.             return -1;
  154.         }
  155.         l &= 0x7fffffffL;
  156.         s += l;
  157.         n = 100000L * (i + 1);
  158.         printf("\n%7ld   %7ld   %7ld   (%e)", n, l, s,
  159.             (double) s / (double) n);
  160.     }
  161.     putchar('\n');
  162.     return s;
  163. }
  164.     
  165. void
  166. usage(void)
  167. {
  168.     printf("Usage: bert [-v]\n");
  169.     exit(1);
  170. }
  171.  
  172. int
  173. main(int argc, char *argv[])
  174. {
  175.     int cport = 1;
  176.     int c, kc;
  177.     int lastc = 'I';
  178.     long l, l1;
  179.     double d;
  180.  
  181.     delay(1);
  182.     for (c = 1; c < argc; c++)
  183.         if (argv[c][0] == '-') {
  184.             switch (toupper(argv[c][1])) {
  185.             case 'V':
  186.                 verbose = 1;
  187.                 break;
  188.             default:
  189.                 usage();
  190.             }
  191.         } else
  192.             usage();
  193.     if ((comm = open_com(cport, 19200, 0, 1, 8, 0, 1000)) == NULL) {
  194.         printf("COM%d error: %s\n", cport, comm_errmsg(comm_errno));
  195.         return 1;
  196.     }
  197.     atexit(gone);
  198.     printf("Ready...\n");
  199.     do {
  200.         if ((kc = bioskey(1)) != 0)
  201.             kc = bioskey(0) & 0xff;
  202.         kc = toupper(kc);
  203.         if ((c = com_in(comm)) != -1)
  204.             printf("X:%d ", c);
  205.         if (c == -1 && comm_errno != 0)
  206.             reset_buffer(comm);
  207.         if (kc == 'V') {
  208.             printf("%g\n", (double)((int)cmd_resp16(kc, 2000)) * 1.62 / (double) 0x7fff);
  209.             cmd_dsp(lastc);
  210.         } else if (kc == 'D') {
  211.             l = cmd_resp16(kc, 2000);
  212.             printf("%ld, %lx\n", l, l);
  213.             cmd_dsp(lastc);
  214.         } else if (kc == 'S') {
  215.             if ((l = cmd_resp64(kc, 4000, &l1)) == -1)
  216.                 printf("Timeout!\n");
  217.             else {
  218. /* printf("%ld (%08lX)  %ld (%08lX)\n", l, l, l1, l1); */
  219.                 d = (double) l / (double) l1;
  220.                 if (d < 1.0)
  221.                     d = 1.0;
  222.                 printf("SINAD: %g dB", (d == 0) ? 100.0 : 10*log10(d));
  223.                 d -= 1.0;
  224.                 printf("  S/N: %g dB\n", (d == 0) ? -100.0 : 10*log10(d));
  225.             }
  226.             cmd_dsp(lastc);
  227.         } else if (kc == '4' || kc == '5') {
  228.             printf("Running BER Test...");
  229.             l = cmd_resp32(kc, (kc == '4') ? 4000 : 15000);
  230.             if (l == -1)
  231.                 printf("\nTimeout\n");
  232.             else {
  233.                 l &= 0x7fffffffL;
  234.                 printf("\n%7ld   (%e)\n", l,
  235.                     (double) l / ((kc == '4') ? 10000.0 : 100000.0));
  236.             }
  237.             cmd_dsp(lastc);
  238.         } else if (kc == '6' || kc == 'L') {
  239.             while (ber6() != -1 && kc == 'L')
  240.                 ;
  241.             cmd_dsp(lastc);
  242.         } else if (kc != 0 && kc != 0x1b)
  243.             cmd_dsp(kc);
  244.         if (kc == 'C' || kc == 'I' || kc == 'N')
  245.             lastc = kc;
  246.     } while (kc != 0x1b);
  247.     close_com(comm);
  248.     comm = NULL;
  249.     return 0;
  250. }
  251.